#include "common.h"
#include "memory.h"
#include "fs.h"

#define DEFAULT_ENTRY ((void *)0x8048000)
extern void ramdisk_read(void *buf, off_t offset, size_t len);
extern size_t get_ramdisk_size();
extern void _map(_Protect *p, void *va, void *pa);
// uintptr_t loader(_Protect *as, const char *filename) {
//   ramdisk_read(DEFAULT_ENTRY, 0, get_ramdisk_size());
//   return (uintptr_t)DEFAULT_ENTRY;
// }

// uintptr_t loader(_Protect *as, const char *filename) {
//   int fd = fs_open(filename, 0, 0);
//   fs_read(fd, DEFAULT_ENTRY, fs_filesz(fd));
//   fs_close(fd);
//   return (uintptr_t)DEFAULT_ENTRY;
// }

uintptr_t loader(_Protect *as, const char *filename) {
  // 打开文件并获取文件大小
  int fd = fs_open(filename, 0, 0);
  int filesize = fs_filesz(fd);
  // 初始化虚拟地址指针为默认入口地址
  void *vaddr, *page;
  vaddr = DEFAULT_ENTRY;
  // 按页循环加载文件内容
  while (filesize > 0) {
      // 分配一页物理内存
      page = new_page();
      // 建立虚拟地址到物理页的映射
      _map(as, vaddr, page);
      // 从文件读取一页内容到物理页
      fs_read(fd, page, PGSIZE);
      // 更新虚拟地址和剩余文件大小
      vaddr += PGSIZE;
      filesize -= PGSIZE;
  }
  // 关闭文件并返回入口地址
  fs_close(fd);
  return (uintptr_t)DEFAULT_ENTRY;
}

